package com.gcb.common.utils;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.gcb.common.constant.APIConstant;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ShipAPIUtil {
    private static String key = APIConstant.ShipAPIConstant.KEY;


    /**
     * 船只信息API调用封装
     * @param mmisCodes mmsi码 , 隔开
     * @return
     */
    public static JSONObject getManyShip(String mmisCodes){
        // 调用船讯API接口
        String result = HttpUtil.get(String.format(APIConstant.ShipAPIConstant.GET_MANY_SHIP_V2, key, mmisCodes));

        // 解析返回结果
        JSONObject resultJSON = JSONUtil.parseObj(result);
        String resultInfo = checkResultStatus(resultJSON);
        if (!resultInfo.equals("success")){
            return null;
        }
        return resultJSON;
    }

    /**
     * 船只信息API调用封装
     * @param param mmsi码 , 隔开
     * @return
     */
    public static JSONObject getShipMMSIByName(String param){
        // 调用船讯API接口
        String result = HttpUtil.get(String.format(APIConstant.ShipAPIConstant.QUERY_SHIP_V2, key, param));

        // 解析返回结果
        JSONObject resultJSON = JSONUtil.parseObj(result);
        String resultInfo = checkResultStatus(resultJSON);
        if (!resultInfo.equals("success")){
            return null;
        }
        return resultJSON;
    }

    /**
     * 获取船只轨迹方法
     * @param cut 是否截断 0不截断 1截断
     * @param mmisCode mmsi码
     * @param startTime 开始日期 格式：unix时间戳 单位：秒
     * @param endTime 结束日期 格式：unix时间戳 单位：秒
     * @return
     */
    public static JSONObject getShipTrack(Integer cut , String mmisCode , Long startTime , Long endTime){
        // 调用船讯API接口
        String result = HttpUtil.get(String.format(
                APIConstant.ShipAPIConstant.GET_SHIP_TRACK,
                APIConstant.ShipAPIConstant.KEY,
                cut,
                mmisCode ,
                startTime ,
                endTime));

        // 解析返回结果
        JSONObject resultJSON = JSONUtil.parseObj(result);
        String resultInfo = checkResultStatus(resultJSON);
        if (!resultInfo.equals("success")){
            return null;
        }
        return resultJSON;
    }

    public static String checkResultStatus(JSONObject result) {
        if (result.containsKey("status")) {
            int status = result.get("status", Integer.class);
            if (status == 0){
                return "success";
            }else {
                if (status == 1) {
                    log.error("调用船讯API接口失败，失败原因：{}", "失败（具体原因不明）");
                } else if (status == 3) {
                    log.error("调用船讯API接口失败，失败原因：{}", "操作对象不存在(船舶、船队等)");
                } else if (status == 6) {
                    log.error("调用船讯API接口失败，失败原因：{}", "Key 过期");
                } else if (status == 7) {
                    log.error("调用船讯API接口失败，失败原因：{}", "key 被锁定");
                } else if (status == 9) {
                    log.error("调用船讯API接口失败，失败原因：{}", "key 不存在");
                } else if (status == 12) {
                    log.error("调用船讯API接口失败，失败原因：{}", "请求数据量过大，拒绝执行");
                } else if (status == 13) {
                    log.error("调用船讯API接口失败，失败原因：{}", "服务器繁忙");
                } else if (status == 14) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 请求来自非绑定域名");
                } else if (status == 15) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 多船请求数量超过限制");
                } else if (status == 16) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 区域船接口超出区域外");
                } else if (status == 17) {
                    log.error("调用船讯API接口失败，失败原因：{}", "写授权码错误");
                } else if (status == 19) {
                    log.error("调用船讯API接口失败，失败原因：{}", "程序内部错误");
                } else if (status == 21) {
                    log.error("调用船讯API接口失败，失败原因：{}", "不具备服务使用权限");
                } else if (status == 22) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 查询船舶数量已超限");
                } else if (status == 23) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 查询船舶次数已超限");
                } else if (status == 24) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 查询船舶超出限定船舶集合");
                } else if (status == 25) {
                    log.error("调用船讯API接口失败，失败原因：{}", " 查询船舶档案数量已超限");
                }
                return "error";
            }

        }
        return "error";
    }

    public static double convertMmPerSecToKnots(double mmPerSec) {
        // 将毫米每秒转换为米每秒
        double mPerSec = mmPerSec / 1000.0;

        // 将米每秒转换为千米每小时
        double kmPerHour = mPerSec * 3.6;

        // 将千米每小时转换为海里每小时

        return kmPerHour / 1.852;
    }
}
